home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 10 / 9 / DISK1095.ZIP / LINKSKL.PRG < prev    next >
Text File  |  1986-10-06  |  11KB  |  344 lines

  1. * LINKSKL
  2. * SKELETON FOR FILE MAINTENANCE SCREEN WHICH LINKS TO A LINE FILE
  3. * SUPPORTS HIERARCHICAL FILE STRUCTURES: HEADER-LINE, PARENT-CHILD, ETC.
  4. * FILE STRUCTURE MUST ALREADY EXIST
  5. SET HEADING OFF
  6. SET SAFETY OFF
  7. SET STATUS OFF
  8. CLEAR
  9. CLEAR ALL
  10. SET TALK OFF
  11. SET BELL OFF
  12. * DEFINE A STRING OF BLANKS
  13. STORE SPACE(80) TO BLANK
  14. * CLEAR REQUEST AND ACTION CONTROL VARIABLES
  15. STORE " " TO REQUEST
  16. STORE " " TO ACTION
  17. *
  18. *===============================START MODS: 1================================*
  19. * SET NAME OF PRIMARY (PARENT) FILE                                          *
  20. STORE "filename" TO FILENAME
  21. * SET NAME OF SECONDARY (CHILD) FILE
  22. STORE "linkname" TO LINKNAME
  23. * SETUP COUNT OF INDEXES FOR THE FILE filename
  24. STORE 2 TO IXCOUNT
  25. * SETUP CONSTANTS CONTAINING INDEXES IN SEQUENCE TO USE IN MACRO LATER.
  26. * LIST EACH INDEX FIRST AS A PRIMARY INDEX. VARIABLES NAMED IXA, IXB, IXC, ETC.
  27. STORE "index1,index2" TO IXA
  28. * DEFINE KEYS FOR INDEX. IF NUMERIC, MUST CONVERT WITH STR(). USE DI+IXA, ETC.
  29. STORE "field1" TO DIIXA
  30. STORE "index2,index1" TO IXB
  31. STORE "STR(field2,10,2)" TO DIIXB
  32. * DEFINE KEY WHICH LINKS PARENT AND CHILD RECORDS DEFINED IN TERMS OF PARENT
  33. * FILE FIELDS.
  34. STORE "P.field1" TO DIPARENT
  35. * DEFINE CORRESPONDING KEY IN TERMS OF PARENT RECORD FIELDS
  36. * CHILD FILE INDEXING ONLY POSSIBLE IN PRESENCE OF PARENT
  37. STORE "P.field1" TO DILINK
  38. * SETUP NAME OF INDEX FILE FOR THE LINKED FILE. MUST NOT BE SAME NAME AS A
  39. * PARENT FILE INDEX
  40. STORE "linkindex" TO IXLINK
  41. *==================================END MODS==================================*
  42. *
  43. * SAVE NAME OF MACRO WHICH CONTAINS ACTIVE INDEX AS FIRST INDEX
  44. STORE "IXA" TO LIVE_IX
  45. * GET RECORD COUNTS
  46. USE &FILENAME
  47. COUNT TO RECCNT
  48. USE &LINKNAME
  49. COUNT TO LINKCNT
  50. STORE "N" TO DATAIN
  51. * IF FILE IS EMPTY, ASSUME INDEXES NOT CREATED AND CREATE THEM
  52. SELECT A
  53. IF RECCNT=0 .AND. IXCOUNT>0
  54.    STORE 1 TO COUNT
  55.    DO WHILE COUNT<=IXCOUNT
  56.       STORE "IX"+CHR(64+COUNT) TO TEMP
  57.       STORE "DI"+TEMP TO TEMP2
  58.       IF IXCOUNT>1
  59.          STORE SUBSTR(&TEMP,1,AT(",",&TEMP)-1) TO TEMP
  60.       ELSE
  61.          STORE &TEMP TO TEMP
  62.       ENDIF
  63.       STORE &TEMP2 TO TEMP2
  64.       INDEX ON &TEMP2 TO &TEMP
  65.       STORE COUNT+1 TO COUNT
  66.    ENDDO
  67. ENDIF
  68. * ADD INDEXES
  69. SET INDEX TO &IXA
  70. * POSITION AT FIRST RECORD IN LIVE INDEX SEQUENCE FOR INITIAL DISPLAY
  71. GO TOP
  72. * IF LINK FILE IS EMPTY, ASSUME INDEX NOT CREATED AND CREATE IT
  73. SELECT B
  74.    INDEX ON &DILINK TO &IXLINK
  75. * ADD INDEX FOR LINKED FILE
  76. SET INDEX TO &IXLINK
  77. * POSITION LINKED FILE AT FIRST CHILD RECORD MATCHING KEY IN PARENT
  78. SEEK DIPARENT
  79. *
  80. * MAIN UPDATE LOOP. TERMINATED BY 'M' AS REQUEST
  81. DO WHILE REQUEST<>"M"
  82. *  CLEAR RECORD DISPLAY AREA. TO SAVE TIME, COULD CLEAR ONLY LINES WITH
  83. *  FIELDS FROM CHILD FILE
  84.    STORE 1 TO COUNT
  85.    DO WHILE COUNT<19
  86.       @ COUNT,0 SAY BLANK
  87.       STORE COUNT+1 TO COUNT
  88.    ENDDO
  89. *
  90. *===============================START MODS: 2================================*
  91. * DISPLAY SCREEN MASK: HEADING INFORMATION PLUS LABELS FOR EACH FIELD        *
  92.    @ 1,22 SAY "SMITH'S BIKEWORKS INFORMATION SYSTEM"
  93.    @ 3,11 SAY ">> ??????????????? System File Maintenance <<"
  94.    @ 5,17 SAY "Today's Date:"
  95.    ?? DATE()
  96. * SETUP VARIABLE PART OF MASK
  97.    SELECT A
  98. * ALL FOLLOWING FIELDS ARE FROM PARENT FILE
  99.    @ 7,1  SAY "Field No 1 " GET P.field1
  100.    @ 9,1  SAY "Field No 2 " GET P.field2
  101.    @ 11,1 SAY "Field No 3 " GET P.field3
  102. *============================================================================
  103. *
  104. * ONLY CHILD RECORDS MAY BE ADDED OR EDITED
  105.    CLEAR GETS
  106. * SEE IF KEYS MATCH IN PARENT AND CHILD. IF NOT, TRY FIND ON SECONDARY FILE
  107.    IF REQUEST = "<"
  108.       SELECT B
  109.       GO TOP
  110.    ENDIF
  111.    SELECT B
  112.    IF (EOF() .OR. BOF()).OR.REQUEST<>"A".AND.&DIPARENT<>&DILINK
  113.       STORE &DIPARENT TO TEMP
  114.       SEEK TEMP
  115.    ENDIF
  116. *
  117. *================================START MODS: 3===============================*
  118. *
  119. * DISPLAY CHILD RECORD ONLY IF THERE IS ONE THAT MATCHES PARENT
  120. * FIELDS RETRIEVED ARE FROM THE CHILD (SECONDARY) FILE
  121.    IF .NOT. (EOF() .OR. BOF())
  122.       @ 16,1  SAY "Linked field 1 " GET  Sfield1
  123.       @ 17,1  SAY "Linked field 2 " GET  Sfield2
  124.    ENDIF
  125. * DATE OF LAST UPDATE SHOULD BE ONE OF THE FIELDS (LAST_UPDT)
  126. * BOTH PARENT AND CHILD FILES WILL BE ASSUMED TO CONTAIN LAST_UPDT FIELDS
  127.    @ 18,1 SAY "Last Updated : "
  128.    ?? A->UPDT, B->LAST_UPDT
  129. *==================================END MODS==================================*
  130. *
  131. * DISPLAY VARIABLE DATA IN SCREEN HEADING
  132.    IF DELETE()
  133.       @ 5,1 SAY "* DELETED *"
  134.    ELSE
  135.       @ 5,1 SAY "           "
  136.    ENDIF
  137. * IDENTIFY RECORD
  138. * USE PARENT RECORD RECORD NUMBER
  139.    SELECT A
  140.     @ 5,43 SAY "Record"
  141.     @ 5,50 SAY RECNO()
  142.     @ 5,62 SAY "of"
  143.     @ 5,64 SAY RECCNT
  144. * NOW MAKE SECONDARY FILE ACTIVE, SINCE EDITING OPERATIONS WILL BE ON THIS FILE
  145.    SELECT B
  146. * IF DATAIN FLAG SET, ACTIVATE THE GETS
  147.    IF DATAIN="Y"
  148.       @ 19,72 GET ACTION
  149.       READ
  150. * DATE STAMP CHILD RECORD
  151.       REPLACE LAST_UPDT WITH DATE()
  152.       IF REQUEST="E".OR.ACTION<>"C"
  153.          STORE "N" TO DATAIN
  154.          STORE " " TO REQUEST
  155.          STORE " " TO ACTION
  156.       ENDIF 2
  157.    ELSE
  158.       CLEAR GETS
  159.    ENDIF 1
  160. *
  161. * DISPLAY CONTROL SUBMENU, CURRENT ACTIVE INDEX
  162.    @ 19,0 SAY BLANK
  163.    @ 20,0 SAY "----------------------------------------"
  164.    @ 20,40 SAY "----------------------------------------"
  165.    @ 21,0 CLEAR
  166.    @ 21,2 SAY ;
  167. "<F>ind Record  <A>dd Record   <D>elete/Recall  <E>dit Record   Current Active"
  168.    @ 22,2 SAY ;
  169. "<P>rev Record  <N>ext Record  <M>enu (return)  <K>ey Select    Key:          "
  170.    @ 23,2 SAY ;
  171. "< prev, next linked record >"
  172. * IF INDEX SET NAMED IN LIVE_IX HAS MULTIPLE ENTRIES, EXTRACT FIRST
  173.    IF (","$&LIVE_IX)
  174.       STORE SUBSTR(&LIVE_IX,1,AT(",",&LIVE_IX)-1) TO TEMP
  175.       @ 22,70 SAY TEMP
  176.    ELSE
  177.       @ 22,70 SAY &LIVE_IX
  178.    ENDIF
  179. * GET REQUEST AND FORCE TO UPPER CASE UNLESS ALREADY IN 'A' FOR ADD RECORDS
  180.    IF REQUEST<>"A"
  181.       STORE " " TO REQUEST
  182.       STORE " " TO ACTION
  183.       @ 23,35 SAY "*** NEXT ACTION TO PERFORM " GET REQUEST
  184.       READ
  185.       STORE UPPER(REQUEST) TO REQUEST
  186.    ENDIF
  187. * CLEAR ADD RECORD COMMAND LINE, SUBMENU AREA
  188.    @ 21,0 CLEAR
  189.    DO CASE
  190. * ADD NEW CASE OR EDIT DISPLAYED CASE
  191.       CASE REQUEST="A".OR.REQUEST="E"
  192. * WILL ADD CHILD RECORD. CAN ONLY ADD IF THERE IS AT LEAST ONE PARENT
  193.          IF RECCNT>0
  194.             SELECT B
  195. * IN ADD MODE, APPEND A BLANK RECORD FOR THE DATA AND POSITION TO THAT RECORD
  196.             IF REQUEST="A"
  197.                @ 19,6 SAY "*** PRESS 'C' TO CONTINUE ADDING NEW RECS, ANYTHING;
  198.  ELSE TO QUIT"
  199.                APPEND BLANK
  200.                STORE LINKCNT+1 TO LINKCNT
  201.                GO LINKCNT
  202. * SETUP PARENT RECORD KEY VALUE IN CHILD RECORD
  203.                REPLACE &LINKKEY WITH &DIPARENT
  204.             ELSE
  205.                @ 19,6 SAY "******** PRESS ANY KEY TO FINISH EDIT AND RETURN TO;
  206.  SUBMENU     "
  207.             ENDIF
  208.            @ 21,10 SAY "Enter data at cursor position. Move among fields with"
  209.            @ 22,10 SAY "cursor control keys. Press ENTER to move to next field"
  210.            @ 23,10 SAY "Press ENTER alone to leave field unchanged."
  211. * SET FLAG TO CAUSE NEW DATA TO BE READ
  212.             STORE "Y" TO DATAIN
  213.          ENDIF
  214. * TOGGLE DELETE FLAG. * FUNCTION CHECKS IF RECORD NOW FLAGGED AS DELETED
  215.       CASE REQUEST="D"
  216.          IF DELETE()
  217.             RECALL
  218.          ELSE
  219.             DELETE
  220.          ENDIF
  221. * PREVIOUS RECORD IN ACTIVE INDEX SEQUENCE
  222.       CASE REQUEST="P"
  223.          SELECT A
  224.          SKIP -1
  225. * NEXT THREE LINES SECURE THE BACKWARD LOOP
  226.          IF BOF()
  227.             GO BOTTOM
  228.          ENDIF
  229.          SELECT B
  230. * NEXT RECORD IN ACTIVE INDEX SEQUENCE
  231.       CASE REQUEST="N"
  232.          SELECT A
  233.          SKIP +1
  234. * NEXT THREE LINES SECURE THE FOWARD LOOP
  235.          IF EOF()
  236.             GO TOP
  237.          ENDIF
  238.          SELECT B
  239. * PREVIOUS CHILD RECORD IN ACTIVE INDEX SEQUENCE
  240.       CASE REQUEST="<"
  241. * SAVE CURRENT LOCATION TO SEE IF AT BEGINNING
  242.          STORE RECNO() TO RECNOW
  243. * NEXT THREE LINES SECURE THE BACKWARD LOOP
  244.          IF BOF()
  245.             GO BOTTOM
  246.          ELSE
  247.             SKIP -1
  248.          ENDIF
  249. * IF PARENT AND CHILD DON'T MATCH, OR AT BEGINNING OF CHILD FILE, BACKUP PARENT
  250.          IF &DIPARENT<>&DILINK.OR.BOF()
  251.             SELECT A
  252.             SKIP -1
  253. * NEXT THREE LINES SECURE THE BACKWARD LOOP
  254.             IF BOF()
  255.                GO BOTTOM
  256.             ENDIF
  257.             SELECT B
  258.          ENDIF
  259. * NEXT CHILD RECORD IN ACTIVE INDEX SEQUENCE
  260.       CASE REQUEST=">"
  261. * SAVE CURRENT LOCATION TO SEE IF AT BEGINNING
  262.          STORE RECNO() TO RECNOW
  263. * NEXT THREE LINES SECURE THE FOWARD LOOP
  264.          IF EOF()
  265.             GO TOP
  266.          ELSE
  267.             SKIP +1
  268.          ENDIF
  269. **IF PARENT AND CHILD DON'T MATCH, OR AT END OF CHILD FILE, ADVANCE PARENT
  270.          IF &DIPARENT<>&DILINK
  271.             SELECT A
  272.             SKIP +1
  273. * NEXT THREE LINES SECURE THE FOWARD LOOP
  274.             IF EOF()
  275.                GO TOP
  276.             ENDIF
  277.             SELECT B
  278.          ENDIF
  279. * GET SEARCH VALUE FOR INDEXED SEARCH
  280.       CASE REQUEST="F"
  281.          SELECT A
  282. * USE MACRO DEFINING INDEX ENTRIES FROM DATA FIELDS
  283.          STORE "DI"+LIVE_IX TO IXDEF
  284.          STORE &IXDEF TO SV
  285.          STORE &SV TO SV
  286.          @ 21,1 SAY ;
  287.          "ENTER SEARCH VALUE. VALUE SHOWN IS FROM THE DISPLAYED RECORD. PRESS"
  288.          @ 22,1 SAY "CTRL-Y TO CLEAR " GET SV
  289.          READ
  290. * REMOVE TRAILING BLANKS BEFORE SEARCH
  291.          STORE TRIM(SV) TO SEARCH
  292. * IF RECORD IS NOT FOUND POSITION STAYS AT CURRENT RECORD
  293. * FIND IS IN PARENT FILE
  294.          SELECT A
  295. * NEXT LINE KEEPS TRACK OF CURRENT RECNO() FOR TEST BELOW
  296.          STORE RECNO() TO NOW
  297.          SEEK SEARCH
  298. * NEXT 3 LINES KEEP PRESENT RECORD DISPLAYED IF NO FIND.
  299.          IF EOF()
  300.             GOTO NOW
  301.          ENDIF
  302.          SELECT B
  303. * CHANGE INDEX
  304.       CASE REQUEST="K"
  305. * MUST POINT TO PARENT FILE WHILE INDEX IS CHANGED
  306.          SELECT A
  307.          STORE RECNO() TO RECNOW
  308.          STORE " " TO IXCHOICE
  309. * SETUP MENU OF INDEX NAMES, PROVIDE IF CLAUSE FOR EACH INDEX                *
  310.          @ 21,9 SAY " "
  311.          STORE 1 TO COUNT
  312.          DO WHILE COUNT<=IXCOUNT
  313.             STORE "IX"+CHR(64+COUNT) TO TEMP
  314.             IF IXCOUNT>1
  315.                ?? CHR(64+COUNT)+". "+SUBSTR(&TEMP,1,AT(",",&TEMP)-1)+" "
  316.             ELSE
  317.                ?? CHR(64+COUNT)+". "+&TEMP
  318.             ENDIF
  319.             STORE COUNT+1 TO COUNT
  320.          ENDDO
  321.          @ 22,10 SAY "Press letter of desired key " GET IXCHOICE
  322.          READ
  323.          STORE UPPER(IXCHOICE) TO IXCHOICE
  324.          IF IXCHOICE>="A".AND.IXCHOICE<=CHR(64+IXCOUNT)
  325.             STORE "IX"+IXCHOICE TO LIVE_IX
  326.             STORE &LIVE_IX TO TEMP
  327.             SET INDEX TO &TEMP
  328.          ENDIF
  329. * GOTO THIS RECORD TO ACTIVATE INDEX
  330.          IF RECNOW>0
  331.             GO RECNOW
  332.          ELSE
  333.             GO BOTTOM
  334.          ENDIF
  335. * MAKE SECONDARY FILE ACTIVE AGAIN
  336.          SELECT B
  337.    ENDCASE
  338. ENDDO
  339. * FALL OUT OF DO WHEN 'M' IS REQUEST, RETURN TO SUBSYSTEM'S MENU
  340. CLEAR
  341. RETURN
  342.  
  343.  
  344.